export function normalizePort(val) {
  const port = parseInt(val, 10);

  if (isNaN(port)) {
    // 如果转换为数字失败，那么val可能是字符串形式的命名管道
    return val;
  }

  if (port >= 0) {
    // 是有效的端口号
    return port;
  }

  // 不是有效的端口，返回false
  return false;
}

export function onError(error) {
  if (error.syscall !== 'listen') {
    // 如果错误不是因为调用了listen方法，直接抛出
    throw error;
  }

  const bind = typeof error.port === 'string'
    ? `Pipe ${error.port}`
    : `Port ${error.port}`;

  // 处理常见的listen错误
  switch (error.code) {
    case 'EACCES':
      console.error(`${bind} 权限不足`); // 绑定端口需要更高的权限
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(`${bind} 被占用`); // 端口已被占用
      process.exit(1);
      break;
    default:
      throw error;
  }
}

export function onListening(server) {
  const addr = server.address();
  const bind = typeof addr === 'string'
    ? `pipe ${addr}` // 对于Unix域socket（例如命名管道）
    : `port ${addr.port}`; // 对于TCP/IP端口

  // 使用debug模块记录服务器监听的地址或端口
  console.log(`服务器启动在：http://localhost:${addr.port}`);
}
